//
//  HJJT.h
//  YGMobile
//
//  Created by zhanglu on 2017/2/13.
//  Copyright © 2017年 Elephants Financial Service. All rights reserved.
//

#ifndef __Chart__HJJT__
#define __Chart__HJJT__

#include "KLineData.h"
#include "IndexData.h"
#include <string>
#include <vector>

namespace ytx {
    
    namespace HJJTPosition {
        enum HJJTPosition{
            Bear = -1,  // 空头区域
            Bull = 1,    // 多头区域
            Empty = 0   // 无数据
        };
    }
    
    struct HJJTItem {
        
        YTXTime signalTime; // SignalTime; // 信号时间，信号发生时间，取K线收线时刻，time_t
        HJJTPosition::HJJTPosition position;
        double beginPrice;// BeginPrice;  // BeginPrice是画阶梯开始的价格；每增加一个K线，BeginPrice增加一个值
        double endPrice; //EndPrice;    // EndPrice是画阶梯结束的价格；每增加一个K线，EndPrice增加一个值
        double upLine; //UpLine;  // 高抛区域价格，黄金分割线的顶部价格
        double bottom; //Bottom;  // 多头关注区价格，黄金分割线的次顶部价格
        double sUpLine; //SUpLine; // 观望区上边界价格，黄金分割线的上中部价格线
        double upMid; //UpMid; // 观望区下边界价格，黄金分割线的下中部价格
        double downMid; //DownMid; // 空头关注区价格，黄金分割线的次底部价格
        double sBottom; //SBottom; // 低吸区价格，黄金分割线的底部价格
        int trend; //Trend;  // 趋势强度，Trend是尊享版中衡量趋势度的数据字段；需要配合Position字段使用
        int temper; //Temper; // 市场热度，Temper是尊享版中衡量市场热度的数据字段
        YTXTime tradedate; // TradingDay; // 交易日，交易日，如20170101
        double getBeginPrice() const {return 3989;};
        double getEndPrice() const {return 3900;};
        HJJTPosition::HJJTPosition getPosition() const {return HJJTPosition::Bear;};
    };
    
    class HJJT : public IndexData
    {
    public:
        HJJT(IndexConfig indexConfig);
        
        virtual void calculate(Quotation * data);
        
        virtual void updateLastest(Quotation * data);
        
        virtual void callback(std::string tag, std::string data);
        
        virtual void onFail(std::string tag);
        
        virtual void clearIfParentDataChanged(const Quotation * data);
        
        virtual int getDataLength() const;
        
        virtual void cleanData();
        //        virtual bool isInLatestNewK(YTXTime tradedate1, YTXTime tradedate2);
    private:
        bool requesLock;
        
    protected:
        KLineData * kLineData;
        std::vector<HJJTItem> HJJTData;
        virtual std::vector<HJJTItem> getHJJTDataFromDB(YTXTime time, const unsigned int limit);
        virtual void getHJJTData();
        virtual void getHJJTDataFront();
        virtual void getHJJTDataBack();
        
        virtual void requestHJJTData();
        //取未来
        virtual void requestHJJTDataBack(std::string date);
        //取过去
        virtual void requestHJJTDataFront(std::string date);
        
        virtual std::vector<HJJTItem> parseHJJTData(YTXJson::Value data, YTXJson::Value info);
        
        virtual void responseHJJTData(YTXJson::Value data, YTXJson::Value info);
        virtual void responseHJJTDataFront(YTXJson::Value data, YTXJson::Value info);
        virtual void responseHJJTDataBack(YTXJson::Value data, YTXJson::Value info);
        
        virtual void initHJJTData(std::vector<HJJTItem> gsList);
        virtual void pushHJJTData(std::vector<HJJTItem> gsList);
        virtual void insertFrontHJJTData(std::vector<HJJTItem> gsList);
        
        virtual bool saveHJJTDataToDB(std::vector<HJJTItem>);
        virtual bool hasHJJTData();
        //        virtual void setGameMatrixData(GameMatrixItem gs);
        
        virtual void realCalculate(KLineData * data);
        
        //-1没找到
        int getHJJTIndexInKLinedata(YTXTime time, KLineData * data);
        
        int getHJJTIndexInKLinedataFront(KLineData * data);
        int getHJJTIndexInKLinedataBack(KLineData * data);
    };
}

#endif /* defined(__Chart__HJJT__) */
